#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QSettings>
#include <QFileDialog>
#include <QMessageBox>
#include <QProgressDialog>
#include <QFileInfo>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QStringList>
#include <QTextStream>
#include <QVector>
#include <QFile>
#include <QPaintEvent>
#include <QPainter>
#include <QMutex>
#include <QByteArray>
#include <QFile>

#include "HexFileHelp.h"
#include "ModbusHelp.h"

namespace Ui {
class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private slots:
    ///
    /// \brief on_loadDataFiles
    ///加载数据文件
    void on_loadDataFiles();

    ///
    /// \brief on_LimitValueChanged
    ///响应 X Y 通道极限值变化
    void on_LimitValueChanged();

    ///
    /// \brief bufValuesToNormal
    ///原始数据 转换为归一化数据
    void bufValuesToNormal();

    ///
    /// \brief on_btnGenHexFile_clicked
    /// 响应 生成 Hex文件按钮 按下事件
    void on_btnGenHexFile_clicked();

    ///
    /// \brief on_btnSendToModbus_clicked
    ///响应 把数据发送到Modbus按钮 按下事件
    void on_btnSendToModbus_clicked();

    ///
    /// \brief on_btnReadFromModbus_clicked
    ///响应 从Modbus读取数据按钮 按下事件
    void on_btnReadFromModbus_clicked();

private:
    Ui::MainWidget *ui;

    //存放加载文件 原始数据值的 缓冲指针
    QVector<double> *m_xbufValuesPtr;
    QVector<double> *m_ybufValuesPtr;

    //原始数据的 最小值 最大值
    double m_OrgChxMin,m_OrgChxMax,m_OrgChyMin,m_OrgChyMax;

    //原始数据值的转换为归一化数据的 缓冲区
    QVector<double> m_xNormalValues;
    QVector<double> m_yNormalValues;

    //是否正在加载数据中
    volatile bool m_isLoadingFiles;

    //刷新波形互斥锁
    QMutex m_displayMutex;

    //modbus 操作成员变量对象
    ModbusHelp *m_modbusobj;

    ///
    /// \brief paintWaveInWidget 在指定的 widget 中绘制指定颜色的指定数据波形
    /// \param w 目标控件
    /// \param data 绘制的数据
    /// \param color 绘制的波形颜色
    ///
    void paintWaveInWidget(QWidget *w,const QVector<double> &data,QColor color);

    // QObject interface
public:
    bool eventFilter(QObject *watched, QEvent *event);
};

#endif // MAINWIDGET_H
